package com.example.permissionsystem1_1.common.businessFunction;

import com.example.permissionsystem1_1.common.entity.CommonReqModel;
import com.example.permissionsystem1_1.common.entity.CommonRspModel;
import com.example.permissionsystem1_1.util.reflectUtil.FunctionByReflectUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

public class BaseServiceImpl implements BaseService {
    public Logger logger = LoggerFactory.getLogger(BaseServiceImpl.class);

    /**
     * 指定字段的重复性校验
     * @param dao
     * @param executeMethod
     * @param t
     * @param fieldNames
     * @param model
     * @param <T>
     * @return
     */
    public <T> T fieldsRepeatCheck(BaseDao dao, String executeMethod, T t, List<String> fieldNames, String model) throws NoSuchFieldException, IllegalAccessException, ClassNotFoundException, InstantiationException, InvocationTargetException, NoSuchMethodException {
        if(dao==null||t==null||fieldNames==null||fieldNames.size()<=0){
            return null;
        }
        if(executeMethod==null||"".equals(executeMethod)){
            executeMethod="selects";//设置默认值:使用selects方法进行重复性判断
        }
        if(model==null||"".equals(model)){
            model="insert";//设置默认值:按照新增模式来处理
        }
        boolean flag=false;
        //对每个不可重复的字段进行检测,如果都没有重复才证明可以执行
        for (String fieldName: fieldNames) {
            //1.获取对应的属性值
            Object fieldValue=FunctionByReflectUtil.getFieldValue(fieldName,t);
            //2.获取对应的属性类型
            Class fieldClass=FunctionByReflectUtil.getFieldClass(fieldName,t.getClass());
            //3.创建对应t类型的新的实例对象
            List<String> fNames=new ArrayList<>();
            fNames.add(fieldName);
            List<Object> fValues=new ArrayList<>();
            fValues.add(fieldValue);
            T tpo=FunctionByReflectUtil.createObject(t.getClass().getName(),fNames,fValues);
            //4.填充参数,执行指定的方法
            List<Class> classes=new ArrayList<>();
            classes.add(tpo.getClass());
            List<Object> objects=new ArrayList<>();
            objects.add(tpo);
            Object methodResult=FunctionByReflectUtil.executeMethod(dao,executeMethod,classes,objects);
            if(methodResult==null||((List)methodResult).size()<=0){//此字段肯定不重复
                continue;
            }
            if("insert".equals(model)){//新增模式
                flag=true;//出现重复字段,停止校验
                break;
            }else if("update".equals(model)){//修改模式
                List methodResults=(List)methodResult;
                for (Object obj : methodResults) {
                    //目前的查询方法,其入参和返回值类型是一样的,只不过返回值是List的集合
                    T tObj=(T)obj;
                    Long tId=Long.valueOf(String.valueOf(FunctionByReflectUtil.getFieldValue("id",tObj)));
                    Long id=Long.valueOf(String.valueOf(FunctionByReflectUtil.getFieldValue("id",t)));
                    if(!tId.equals(id)){//如果id不一致,则说明已经存在了另一条记录占用了这个字段的值
                        flag=true;//出现重复字段,停止校验
                        break;
                    }
                }
                if(flag){
                    break;
                }
            }else{
                flag=true;//按重复字段处理
                break;
            }
        }
        if(flag==true){
            logger.error("出现重复字段,新增或修改无效");
            //判断有重复值的字段,所以以null的形式返回(仅针对本项目的架构)
            return null;
        }
        return t;
    }




//    @Autowired
//    private BaseDao baseDao;

//    @Override
//    public R insert(CommonReqModel commonReqModel) {
//        return null;
//    }

//    @Override
//    public CommonRspModel<T> insert(T t) {
//        CommonRspModel<T> commonRspModel=new CommonRspModel<>();
//        commonRspModel.setResult(baseDao.insert(t));
//        return commonRspModel;
//    }



}
